// Copyright 2011 Jefferson Willian
// willmont7@gmail.com

#include <cstdio>
#include <string>
#include <map>
#include <iostream>
#include <algorithm>

#define MAX 101
#define INF 1000

using std::string;
using std::map;
using std::cin;
using std::sort;

typedef struct NumErdo {
  string name;
  int pts;
}NumErdo;

bool compare(NumErdo a, NumErdo b) {
  string a1 = a.name.substr(0, 1);
  string a2 = a.name.substr(3, a.name.size()-3);
  string b1 = b.name.substr(0, 1);
  string b2 = b.name.substr(3, b.name.size()-3);

  if (a2 == b2)
    return a1 < b1;
  return a2 < b2;
}

int main() {
  int n;
  int matriz[MAX][MAX];
  int totalnames;
  string tname1;            // Sigla do primeiro nome
  string tname2;            // Segundo nome
  string tname;             // Nome completo
  string allNames[MAX];     // Todos os nomes distintos
  map<string, int> mymap;   // Inverso de allNames
  NumErdo nErdo[MAX];       // Matriz que corresponde aos nome e pontos dos autores
  int buffer[MAX];
  bool stop;
  int t;
  int games = 1;

  while (scanf("%d", &n) && n != 0) {
    for (int i = 0;i < MAX;i++)
      for (int j = 0;j < MAX;j++)
        matriz[i][j] = INF;
    for (int i = 0;i < MAX;i++)
      matriz[i][MAX-1] = INF;

    totalnames = 0;
    mymap.clear();
    for (int i = 0;i < n;i++) {
      buffer[0] = 1;
      /* Processa a linha de entrada com nomes */
      do {
        tname1.clear();
        tname2.clear();
        /* Le sigla e sobrenome */
        cin >> tname1 >> tname2;

        stop = true;
        /* Add espaco na sigla */
        tname1.resize(tname1.size()+1, ' ');
        /* Verifica se eh o ultimo nome da linha */
        if (tname2[tname2.size()-1] != '.')
          stop = false;
        /* Retira o ponto ou virgula */
        tname2.resize(tname2.size()-1);

        /* Combina os nomes */
        tname.clear();
        tname.append(tname1);
        tname.append(tname2);

        /* Adiciona o nome na lista */
        if (mymap.find(tname) == mymap.end()) {
          t = totalnames;
          mymap[tname] = totalnames;
          allNames[totalnames++] = tname;
        } else {
          t = mymap[tname];
        }

        /* Atualiza matriz de distancias */
        for (int j = 1;j < buffer[0];j++) {
          matriz[buffer[j]][t] = 1;
          matriz[t][buffer[j]] = 1;
        }
        buffer[buffer[0]++] = t;
      }while(!stop);
    }

    /* Algoritimo Floyd-Marshall para caminho minimo */
    /* resolve o problema                            */
    for (int k = 0;k < totalnames;k++)
      for (int i = 0;i < totalnames;i++)
        for (int j = 0;j < totalnames;j++)
          if (matriz[i][k] + matriz[k][j] < matriz[i][j])
            matriz[i][j] = matriz[i][k] + matriz[k][j];

    /* Verifica se alguma entrada corresponde ao P. Erdos */
    if (mymap.find("P. Erdos") == mymap.end())
      t = MAX-1;
    else
      t = mymap["P. Erdos"];

    /* Cria uma matriz com os autores e seus pontos */
    for (int i = 0, j = 0;i < totalnames;i++) {
      if (i == t)
        continue;
      nErdo[j].name = allNames[i];
      nErdo[j++].pts = matriz[i][t];
    }

    /* Verifica se nao houve uma entrada P. Erdos */
    if (t == MAX-1)
      totalnames++;

    /* Ordena a matriz */
    sort(nErdo, nErdo+totalnames-1, compare);

    /* Imprime resultado */
    printf("Teste %d\n", games++);
    for (int i = 0;i < totalnames-1;i++) {
      printf("%s: ", nErdo[i].name.c_str());
      if (nErdo[i].pts == INF)
        printf("infinito\n");
      else
        printf("%d\n", nErdo[i].pts);
    }
    printf("\n");
  }

  return 0;
}
